package com.ljm.common.page;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @author ChenHuaMing
 * @param <T> 分页dto
 */
public interface IPageDto<T> extends Serializable {
    /**
     * 倒序
     * @return 倒序信息
     */
    default String[] descs() {
        return null;
    }

    /**
     * 顺序
     * @return 顺序信息
     */
    default String[] ascs() {
        return null;
    }

    /**
     * 条件
     * @return 条件
     */
    default Map<Object, Object> condition() {
        return null;
    }

    /**
     * 统计sql
     * @return 统计sql
     */
    default boolean optimizeCountSql() {
        return true;
    }

    /**
     * 偏移
     * @return 偏移数量
     */
    default long offset() {
        return this.getCurrent() > 0L ? (this.getCurrent() - 1L) * this.getSize() : 0L;
    }

    /**
     * 页数
     * @return 页数
     */
    default long getPages() {
        if (this.getSize() == 0L) {
            return 0L;
        } else {
            long pages = this.getTotal() / this.getSize();
            if (this.getTotal() % this.getSize() != 0L) {
                ++pages;
            }

            return pages;
        }
    }

    /**
     * 配置页数
     * @param pages 页数
     * @return 页数
     */
    default IPageDto<T> setPages(long pages) {
        return this;
    }

    /**
     * 结果
     * @return 结果
     */
    List<T> getRecords();

    /**
     * 设置结果
     * @param var1 结果
     * @return 结果信息
     */
    IPageDto<T> setRecords(List<T> var1);

    /**
     * 获取总条数
     * @return 条数
     */
    long getTotal();

    /**
     * 设置总条数
     * @param var1 总条数
     * @return 分页信息
     */
    IPageDto<T> setTotal(long var1);

    /**
     * 获取每页大小
     * @return 页大小
     */
    long getSize();

    /**
     * 设置每页大小
     * @param var1 页大小
     * @return 页大小
     */
    IPageDto<T> setSize(long var1);

    /**
     * 获取当前页
     * @return 当前页
     */
    long getCurrent();

    /**
     * 设置当前页
     * @param var1 当前页
     * @return 当前页
     */
    IPageDto<T> setCurrent(long var1);
}
